/*
 * Copyright (c) 2012, Markus Weber All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this list of
 * conditions and the following disclaimer. Redistributions in binary form must reproduce the
 * above copyright notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * 
 * Neither the name of the author nor the names of its contributors may be used to endorse or
 * promote products derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 */
package de.dfki.graph.index;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * Node
 *
 * @author Markus Weber
 *
 */
public class Node implements Serializable {
    /**
     * Generated serial id
     */
    private static final long serialVersionUID = 2688203617358878993L;
    /**
     * ID of the node
     */
    public final int id;
    /**
     * The index points to the child nodes.
     */
    public Index children;
    /**
     * Labels
     */
    public Set<String> labels;
    /**
     * Unique id
     */
    private byte uid;

    /**
     * Creates a node
     *
     * @param nodeIDsequence
     * @param uid
     * @param decision
     */
    public Node(int nodeIDsequence, byte uid, String decision) {
        this.id = nodeIDsequence;
        this.uid = uid;
        this.children = new Index();
        this.labels = new HashSet<String>();
        this.labels.add(decision);
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * UID of the type.
     *
     * @return
     */
    public byte typeUID() {
        return uid;
    }

    /**
     *
     * @param sequence
     * @param to
     * @param fp
     */
    public void addSequence(byte[] sequence, Node to, final String fp) {
        this.children.addNode(sequence, to);
        this.labels.add(fp);
    }

    public Node getExactMatch(byte[] sequence) {
        return children.getExactMatch(sequence);
    }

    /*
     * (non-Javadoc) @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Node [");
        builder.append("id=");
        builder.append(id);
        builder.append(", uid=");
        builder.append(uid);
        builder.append("]");
        return builder.toString();
    }

    /**
     *
     * @param sequence
     * @return
     */
    public Set<Node> bestMatch(byte[] sequence) {
        Set<Node> best = new HashSet<Node>();
        Node n = children.getBestMatch(sequence);
        if (n != null) {
            best.add(n);
        }
        return best;
    }
}
